package miniprojet.jeux.modele;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.OrderBy;

@Entity
public class Match implements Serializable {

	private int idMatch;
	private int numero;
	private Etat etat;
	private Arbitre arbitre;
	private Equipe equipe1;
	private Equipe equipe2;
	private Collection<But> buts;
	private boolean prolongations;
	private boolean tirsAuButs;
	private int idEquipeGagnante;

	public Match() {
		etat = Etat.Prevu;
		buts = new ArrayList<But>();
		setIdEquipeGagnante(-1);
	}

	@Id
	@GeneratedValue
	public int getIdMatch() {
		return idMatch;
	}

	public void setIdMatch(int idMatch) {
		this.idMatch = idMatch;
	}

	public int getNumero() {
		return numero;
	}

	public void setNumero(int numero) {
		this.numero = numero;
	}

	@Enumerated(EnumType.STRING)
	public Etat getEtat() {
		return etat;
	}

	public void setEtat(Etat etat) {
		this.etat = etat;
	}

	@OneToOne
	public Arbitre getArbitre() {
		return arbitre;
	}

	public void setArbitre(Arbitre arbitre) {
		this.arbitre = arbitre;
	}

	@OneToOne
	public Equipe getEquipe1() {
		return equipe1;
	}

	public void setEquipe1(Equipe equipe1) {
		this.equipe1 = equipe1;
	}

	@OneToOne
	public Equipe getEquipe2() {
		return equipe2;
	}

	public void setEquipe2(Equipe equipe2) {
		this.equipe2 = equipe2;
	}

	@OrderBy("minute DESC")
	@OneToMany
	public Collection<But> getButs() {
		return buts;
	}

	public void setButs(Collection<But> buts) {
		this.buts = buts;
	}

	public ArrayList<But> listeButsSorted() {
		ArrayList<But> list = new ArrayList<But>(buts);
		Collections.sort(list, new Comparator<But>() {
			@Override
			public int compare(But but1, But but2) {
				if (but1.getMinute() < but2.getMinute())
					return -1;
				else if (but1.getMinute() == but2.getMinute())
					return 0;
				else
					return 1;
			}
		});
		return list;
	}

	public ArrayList<But> listeButsParJoueur(int idJoueur) {
		ArrayList<But> list = new ArrayList<But>();
		for (But b : buts) {
			if (b.getAuteur().getIdPersonne() == idJoueur)
				list.add(b);
		}
		Collections.sort(list, new Comparator<But>() {
			@Override
			public int compare(But but1, But but2) {
				if (but1.getMinute() < but2.getMinute())
					return -1;
				else if (but1.getMinute() == but2.getMinute())
					return 0;
				else
					return 1;
			}
		});
		return list;
	}

	public void addBut(But but) {
		buts.add(but);
	}

	public void removeBut(But but) {
		buts.remove(but);
	}

	public boolean isProlongations() {
		return prolongations;
	}

	public boolean prolongationPossible() {
		int nbButEquipe1 = 0;
		int nbButEquipe2 = 0;
		for (But b : buts) {
			if (b.getMinute() <= 90) {
				if (b.getAuteur().getEquipe().getIdEquipe() == getEquipe1()
						.getIdEquipe()) {
					++nbButEquipe1;
				}
				if (b.getAuteur().getEquipe().getIdEquipe() == getEquipe2()
						.getIdEquipe()) {
					++nbButEquipe2;
				}
			}
		}
		if (nbButEquipe1 == nbButEquipe2)
			return true;
		else
			return false;
	}

	public void setProlongations(boolean prolongations) {
		this.prolongations = prolongations;
	}

	public boolean isTirsAuButs() {
		return tirsAuButs;
	}

	public void setTirsAuButs(boolean tirsAuButs) {
		this.tirsAuButs = tirsAuButs;
	}

	public int nbButEquipe1() {
		int res = 0;
		for (But b : buts) {
			if (b.getAuteur().getEquipe().getIdEquipe() == this.getEquipe1()
					.getIdEquipe()) {
				++res;
			}
		}
		return res;
	}

	public int nbButEquipe2() {
		int res = 0;
		for (But b : buts) {
			if (b.getAuteur().getEquipe().getIdEquipe() == this.getEquipe2()
					.getIdEquipe()) {
				++res;
			}
		}
		return res;
	}

	/**
	 * @return the idEquipeGagnante
	 */
	public int getIdEquipeGagnante() {
		return idEquipeGagnante;
	}

	/**
	 * @param idEquipeGagnante
	 *            the idEquipeGagnante to set
	 */
	public void setIdEquipeGagnante(int idEquipeGagnante) {
		this.idEquipeGagnante = idEquipeGagnante;
	}
}
